package com.example.docmanagement.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Data;

/**
 * 文档创建请求 DTO
 * 用于创建新文档时提交的请求数据
 * 
 * 示例 JSON:
 * {
 * "title": "Java入门指南",
 * "slug": "java-getting-started",
 * "summary": "这是一份Java入门教程",
 * "content": "# Java入门\n\n这是内容...",
 * "contentType": "direct",
 * "categoryId": 1,
 * "tags": ["java", "入门", "教程"],
 * "status": "published",
 * "isPublic": true,
 * "language": "zh-CN"
 * }
 */
@Data
@Schema(description = "文档创建请求")
public class DocumentCreateRequest {

    /**
     * 文档标题（必填）
     * 长度限制：1-255个字符
     * 示例："Java入门指南"
     */
    @Schema(description = "文档标题", example = "Java入门指南", required = true, maxLength = 255)
    @NotBlank(message = "标题不能为空")
    @Size(max = 255, message = "标题长度不能超过 255 个字符")
    private String title;

    /**
     * 文档唯一标识符（必填）
     * 用于生成友好的URL路径
     * 格式要求：只能包含小写字母、数字和连字符
     * 长度限制：1-255个字符
     * 示例："java-getting-started"
     */
    @Schema(description = "文档唯一标识符(slug)", example = "java-getting-started", required = true, maxLength = 255, pattern = "^[a-z0-9-]+$")
    @NotBlank(message = "slug 不能为空")
    @Size(max = 255, message = "slug 长度不能超过 255 个字符")
    @Pattern(regexp = "^[a-z0-9-]+$", message = "slug 只能包含小写字母、数字和连字符")
    private String slug;

    /**
     * 文档摘要（可选）
     * 简短描述文档的主要内容
     * 长度限制：最多500个字符
     * 示例："这是一份适合初学者的Java入门教程，涵盖了Java基础语法和核心概念"
     */
    @Schema(description = "文档摘要", example = "这是一份适合初学者的Java入门教程", maxLength = 500)
    @Size(max = 500, message = "摘要长度不能超过 500 个字符")
    private String summary;

    /**
     * 文档内容（可选，与其他content字段选其一）
     * 直接包含文档的完整内容，支持Markdown格式
     * 当contentType为"direct"时使用此字段
     * 示例："# Java入门\n\n## 第一章：环境搭建\n..."
     */
    @Schema(description = "文档内容(Markdown格式)", example = "# Java入门\n\n这是内容...")
    private String content;

    /**
     * 文档内容路径（可选，与其他content字段选其一）
     * 指向服务器上Markdown文件的路径
     * 当contentType为"file"时使用此字段
     * 示例："/docs/java/getting-started.md"
     */
    @Schema(description = "文档内容文件路径", example = "/docs/java/getting-started.md")
    private String contentPath;

    /**
     * 文档内容URL（可选，与其他content字段选其一）
     * 指向外部Markdown文件的URL
     * 当contentType为"url"时使用此字段
     * 示例："https://example.com/docs/java-guide.md"
     */
    @Schema(description = "文档内容外部URL", example = "https://example.com/docs/java-guide.md")
    private String contentUrl;

    /**
     * 文档内容Base64编码（可选，与其他content字段选其一）
     * Base64编码的文档内容
     * 当contentType为"base64"时使用此字段
     */
    @Schema(description = "Base64编码的文档内容")
    private String contentBase64;

    /**
     * 内容类型（可选）
     * 指定文档内容的来源方式
     * 可选值：
     * - "direct": 直接内容（使用content字段）
     * - "file": 文件路径（使用contentPath字段）
     * - "url": 外部URL（使用contentUrl字段）
     * - "base64": Base64编码（使用contentBase64字段）
     * 默认值："direct"
     */
    @Schema(description = "内容类型", example = "direct", allowableValues = { "direct", "file", "url",
            "base64" }, defaultValue = "direct")
    private String contentType = "direct";

    /**
     * 所属分类ID（可选）
     * 关联到categories表的id字段
     * 示例：1
     */
    @Schema(description = "所属分类ID", example = "1")
    private Long categoryId;

    /**
     * 标签列表（可选）
     * 用于文档分类和搜索
     * 示例：["java", "入门", "教程"]
     */
    @Schema(description = "标签列表", example = "[\"java\", \"入门\", \"教程\"]")
    private String[] tags;

    /**
     * 文档状态（可选）
     * 可选值：
     * - "draft": 草稿（默认）
     * - "published": 已发布
     * - "archived": 已归档
     * 默认值："draft"
     */
    @Schema(description = "文档状态", example = "draft", allowableValues = { "draft", "published",
            "archived" }, defaultValue = "draft")
    private String status = "draft";

    /**
     * 是否公开（可选）
     * true: 公开可见
     * false: 私有，仅作者可见
     * 默认值：true
     */
    @Schema(description = "是否公开", example = "true", defaultValue = "true")
    private Boolean isPublic = true;

    /**
     * 文档语言（可选）
     * 使用ISO 639-1语言代码
     * 示例："zh-CN"（简体中文）、"en-US"（英语）、"ja-JP"（日语）
     * 默认值："zh-CN"
     */
    @Schema(description = "文档语言(ISO 639-1)", example = "zh-CN", defaultValue = "zh-CN")
    private String language = "zh-CN";
}
